﻿// Cheese Aizu - 0558.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <queue>
#include <vector>
#include <memory.h>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/Aizu-0558

/*


问题。
JOI 镇的奶酪工厂今年又开始生产奶酪了，老鼠们也从巢里出来了。JOI 镇被划分成北、南、东、西四个地块，
每个地块要么是巢，要么是奶酪工厂，要么是障碍物，要么是空地。 小老鼠从巢穴出发，走访所有奶酪工厂，每家吃一块奶酪。

小镇上有 N 家奶酪工厂，每家只生产一种奶酪。 奶酪的硬度因工厂而异，每家奶酪工厂生产的奶酪硬度从 1 到 N 不等。

小老鼠的初始力量是 1，每吃一块奶酪，力量就增加 1。 但是，老鼠不能吃比它的力量更硬的奶酪。

老鼠可以在一分钟内移动到东西南北的相邻隔间，但不能进入障碍隔间。 它可以通过奶酪工厂而不吃任何奶酪。 
请编写一个程序，找出它吃完所有奶酪所需的最短时间。 注意，小老鼠吃奶酪的时间可以忽略不计。

输入
有 H+1 行输入：第一行包含三个整数 H、W 和 N（1 ≤ H ≤ 1000，1 ≤ W ≤ 1000，1 ≤ N ≤ 9），依次用空格隔开；
从第 2 行到 H+1 行的每一行都包含'S'、'1'、'2'、... , '9', 'X', '.' 分别代表每个地块的状态。 
假设北面的第 i 个地块和西面的第 j 个地块被描述为 (i,j) （1 ≤ i ≤ H，1 ≤ j ≤ W），
那么如果地块 (i,j) 是一个巢穴，第 i+1 行中的第 j 个字符就是'S'；
如果是一个障碍物，第 i+1 行中的第 j 个字符就是'X'；
如果是一块空地，第 i+1 行中的第 j 个字符就是'. 
如果是生产硬度为 1、2、...、9 的奶酪的工厂，则分别为'1'、'2'、...、'9'。。 
输入包含一个巢和一个生产奶酪的工厂，奶酪硬度分别为 1、2、......、......、N。 N。 
其他方格保证是障碍物或空地。 保证小鼠吃掉所有奶酪。

输出。
输出一行整数，表示吃完所有奶酪所需的最短时间（分钟）。

输入/输出示例
输入示例 1
3 3 1
S..
...
..1
输出示例 1
4
输入示例 2
4 5 2
.X..1
....X
.XX.S
.2.X.
输出示例 2
12
输入示例 3
10 10 9
.X...X.S.X
6..5X..X1X
...XXXX..X
X..9X...X.
8.X2X..X3X
...XX.X4..
XX....7X..
X..X..XX..
X...X.XX..
..X.......
输出示例 3
91
*/


/*
奶酪是1到N 不等，所以必须是依次吃。
那么就是N次BFS
*/

const int N = 1010;
char gra[N][N];
bool vis[N][N];
int target[10][2]; int tidx;
int h, w, n;
int startx, starty;
int endx, endy;
int ans = 0;

const int addx[4] = { 0,0,1,-1 };
const int addy[4] = { 1,-1,0,0 };

void bfs(int curr) {	
	memset(vis, 0, sizeof vis);
	if (curr > 1) {
		startx = target[curr - 1][0]; starty = target[curr - 1][1];
	}
	endx = target[curr][0]; endy = target[curr][1];

	queue<vector<int>> q;
	q.push({ startx,starty,0 });
	vis[startx][starty] = 1;

	while (!q.empty()) {
		int x = q.front()[0];
		int y = q.front()[1];
		int step = q.front()[2]; q.pop();
		if (x == endx && y == endy) {
			ans += step; break;
		}
	
		for (int i = 0; i < 4; i++) {
			int newx = x + addx[i]; int newy = y + addy[i];
			if (newx >= 0 && newx < h && newy >= 0 && newy < w && gra[newx][newy] != 'X' && vis[newx][newy] == 0) {
				/*if (gra[newx][newy] >= '1' && gra[newx][newy] >= '9') {
					if (gra[newx][newy] > curr) continue;
				}*/
				vis[newx][newy] = 1;
				q.push({ newx, newy, step + 1 });
			}
		}
	}

}


int main()
{
	cin >> h >> w >> n;

	for (int i = 0; i < h; i++) {
		cin >> gra[i];
		for (int j = 0; j < w; j++) {
			if ('S' == gra[i][j] ) {
				startx = i; starty = j;
			}
			else if (gra[i][j] >= '1' && gra[i][j] <= '9') {
				int v = gra[i][j] - '0';
				target[v][0] = i; target[v][1] = j;
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		bfs(i);
	}

	cout << ans << endl;


	return 0;
}

 